//Prodigy Aimbot
//Credits <:PrOdIgY:>, OGC

//#pragma warning (disable:4800) //Use this if using the autowall pathfree.
//This will crash unless called properly (figure it out).

ProdigyAimbot Probot;
#define Probot 

void VectorAngles( const float *forward, float *angles )
{
	if (!forward[1] == 0 && !forward[0] == 0)
	{
		angles[0] = atan2(forward[2], sqrt(forward[0] * forward[0] + forward[1] * forward[1])) * (57.295791f);
		angles[1] = atan2(forward[1], forward[0]) * (57.295791f);
		angles[2] = 0;
	}
}
aimvec* ProdigyAimbot::TargetRegion(int ax)
{
	vec3_t vecEnd, up, right, forward, EntViewOrg,playerAngles;
	vector<aimvec>::iterator si, end;
	switch(gEngfuncs.GetEntityByIndex(ax)->curstate.gaitsequence)
	{
	case 6:
	{
		si = AimVecsJ.begin();
		end = AimVecsJ.end();
	}
	break;
	case 2:
	{
		si = AimVecsD.begin();
		end = AimVecsD.end();
	}
	break;

	case 5:
	{
		si = AimVecsD.begin();
		end = AimVecsD.end();
	}
	break;
	default:
	{
		si = AimVecsS.begin();
		end = AimVecsS.end();
	} 
	break;
	}
	playerAngles[0]=0; 
	playerAngles[1]=gEngfuncs.GetEntityByIndex(ax)->angles[1]; 
	playerAngles[2]=2; 
	gEngfuncs.pfnAngleVectors(playerAngles, forward, right, up); 
	forward[1] = -forward[2]; 
	for (; si != end; ++si) 
	{ 

	EntViewOrg = gEngfuncs.GetEntityByIndex(ax)->origin + up * si->h + forward * si->f + right * si->r;
	pmtrace_t tr; 
   	gEngfuncs.pEventAPI->EV_SetTraceHull( 2 ); 
   	gEngfuncs.pEventAPI->EV_PlayerTrace( me.pmEyePos, EntViewOrg, PM_GLASS_IGNORE, me.ent->index, &tr ); 
 	 if ( tr.fraction == 1.0 ) return &(*si);

//	if(PathFree(me.pmEyePos,EntViewOrg)) return &(*si); //Use this if you need autowall
}
return NULL;
} 

void ProdigyAimbot::FindTarget()
{
	target = -1;

	for (int ax=0;ax<vPlayers.size();ax++)
	{
		if (vPlayers[ax].getPVS() && TargetRegion(ax) && GetAimingTeam(ax) && (gEngfuncs.GetEntityByIndex(ax)->curstate.sequence != 97 && gEngfuncs.GetEntityByIndex(ax)->curstate.sequence != 98))
		
			{
				target = ax;
			}	
	}


}
void ProdigyAimbot::CalcViewAngles()
{
	vec3_t view,up,right,forward,playerAngles,EntViewOrg;
	playerAngles[0]=0;
	playerAngles[1]=gEngfuncs.GetEntityByIndex(target)->angles[1];
	playerAngles[2]=0;
	gEngfuncs.pfnAngleVectors (playerAngles, forward, right, up);
	forward[2] = -forward[2];
	cl_entity_s* ent = gEngfuncs.GetEntityByIndex(target);
	aimvec* si = TargetRegion(target);
	if(si)
	{
		EntViewOrg = gEngfuncs.GetEntityByIndex(target)->origin + up * si->h + forward * si->f + right * si->r;
	}
	view[0] = EntViewOrg[0] - me.pmEyePos[0];
	view[1] = EntViewOrg[1] - me.pmEyePos[1];
	view[2] = EntViewOrg[2] - me.pmEyePos[2];
			
	VectorAngles(view, aim_viewangles);
	aim_viewangles[0] *= -1; 
	if (aim_viewangles[0]>180) aim_viewangles[0]-=360;
	if (aim_viewangles[1]>180) aim_viewangles[1]-=360;

}

/*bool PathFree(float* from,float* to) //Use this if you need autowall
{ 
   int pathtest; 
   pmtrace_t tr; 
   gEngfuncs.pEventAPI->EV_SetTraceHull( 2 ); 
   gEngfuncs.pEventAPI->EV_PlayerTrace( from, to, PM_GLASS_IGNORE, me.ent->index, &tr ); 
   pathtest = (tr.fraction == 1.0); 
   if (!pathtest && cvar.autowall) 
   { 
      int penetration = WALL_PEN0, bullettype, damage; 
      float distance, wallpierce; 
      penetration = playerItems.CurPenetration(); 
      bullettype = playerItems.CurBulletType(); 
      damage = playerItems.CurDamage(); 
      distance = playerItems.CurDistance(); 
      wallpierce = playerItems.CurWallPierce(); 
      pathtest = CanPenetrate(from, to, distance, penetration, bullettype, damage, wallpierce); 
   } 
   return pathtest; 
}*/